2AZ 構成の ALB でゾーンシフトを試してみた
こんにちは!アノテーションの砂川です。
最近業務で、2AZ 構成の ALB でゾーンシフト機能を検証する機会がありましたため、ご紹介します。
ゾーンシフトとは
特定 AZ (アベイラビリティーゾーン) へのトラフィックを一時的に遮断できる機能です。
例えば、「複数AZ(1a,1c,1d)で動かしている ALB があるけど、1d で AZ 障害が発生しちゃった。。一時的に 1d へのトラフィックを止めたい」のような時に使える機能です。
ゾーンシフト機能を使うことで、ワンクリックで特定ゾーンへのトラフィックを遮断できるため、障害発生時のリソース切り離しがスムーズになり、運用の負担が減りそうですね。
余談ですが、これまで ALB を構成するときは、AZ 障害発生時に備えて、3AZ 構成を取ることがしばしばありました。
ALB は仕様上、2AZ 以上で稼働させる必要があり、3AZ で稼働させていれば、障害発生中の AZ を切り離しても、2AZ の条件を満たすことができます。
一方で、最初から 2AZ のみで運用していた場合は、障害 AZ を切り離すと 1AZ になってしまうため、仕様上その操作はできません。
詳細は以下の記事が大変分かりやすいので、ご参照ください。
- [初級編] なぜ「AWS で負荷分散は3AZ にまたがるのがベストプラクティス」と言われるのか 可用性の面から考えてみた
- 複数のAvailability ZoneにプロビジョニングしたELB(ALB) / AutoScaling Groupから特定Availability Zone上のリソースをパージする
上記のように 3AZ 構成は、冗長化の手段として有効ではありますが、お客様によっては、2AZ の ALB で運用したいなどの要件もあるかと思います。
そんな時、今回のゾーンシフト機能を使えば、2AZ 構成の ALB でもゾーンの切り離しができるため、一時的に 1AZ のみでロードバランサーを稼働させることが可能になります。
もちろん、障害発生時には何が発生するか予測困難のため、ゾーンシフト機能そのものが正常に動作しなくなることもあり得ます。
あくまで本機能は、障害発生時における1つの対策手段として考えておくと良さそうです。
では手順を紹介していきます!
構成図
本ブログで作成する AWS 構成の全体像です。(※クロスゾーン負荷分散がオフの状態の図です。クロスゾーン負荷分散については後述します。)
下記の図では、各 AZ に ALB ノードが1つずつあるように記載していますが、作成する論理 ALB は1つになります。
以下の環境を作成後、ゾーンシフト機能を実施して、特定ゾーンへのトラフィックを遮断できるか検証します。
環境準備
VPC の作成
以下のように、パブリックサブネットを2つ持つ VPC を作成します。作成方法については、【初心者向け】Amazon VPCの作成方法が詳しいので、ご参照ください。
EC2 インスタンスの作成
2つの AZ(ap-northeast-1a, ap-northeast-1c) に1台ずつ EC2 インスタンス(AMI:AL2023)を作成します。
なお、起動するインスタンスは、後ほど作成する ALB からのヘルスチェックに合格する必要があります。
そのため、起動時のユーザーデータに以下のスクリプトを設定し、Apache のドキュメントルート配下(/var/www/html/)にヘルスチェック応答用のファイル(index.html)を配置しておきましょう。
echo "Helo From 1a" の部分は適宜分かりやすいように変えてください。
#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd touch /var/www/html/index.html echo "Hello From 1a" | tee -a /var/www/html/index.html
2台のインスタンスを作成しました。
動作確認として、各インスタンスに直接アクセスしてみます。
それぞれ値が返って来ているので、想定通り設定できています。もしエラーになる場合は、インスタンスのセキュリティグループおよびサブネットの NACL 設定等が適切か確認しましょう。
$ curl 52.196.26.99 Hello From 1a $ curl 13.231.65.75 Hello From 1c
ALB の作成
2AZ 構成の Internet-facing な ALB、 および ALB に紐づく Target Group を作成します。
詳細な作成方法については、ELB(Elastic Load Balancing)を調べて使ってみた。をご参照ください。
以下、作成結果の重点箇所のみ、画像を掲載します。
作成した ALB(ap-northeast-1a, ap-northeast-1c) 作成したターゲットグループ: 2台のインスタンスを登録 ターゲットグループのヘルスチェックパスはデフォルトの「/」を使用
動作確認として、ALB の DNS に対しアクセスしてみます。
$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com Hello From 1c $ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com Hello From 1a
ALB 先の各 AZ にあるインスタンスからレスポンスが返って来ているため、適切に設定できていることが分かります。
もしここでエラーになった場合は、ALB とインスタンスのセキュリティグループを今一度ご確認ください。
次項のゾーンシフト開始後と比較するため、現在の ALB の DNS を確認しておきます。Tips ですが、ALB の DNS 名の先頭にアベイラビリティゾーンを付け加えることで、各 AZ にある ALB ノードの IP を個別に調べることができます。
$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short 54.248.1.219 52.197.178.163 $ dig ap-northeast-1a.sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short 54.248.1.219 $ dig ap-northeast-1c.sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short 52.197.178.163
上記結果より、現在の ALB ドメインには、ap-northeast-1a と ap-northeast-1c の ALB ノード IP が紐付いていることがわかります。
ゾーンシフトを試す
前項までで、環境準備ができたので、ゾーンシフトを実施していきます。
クロスゾーン負荷分散をオフにする
ゾーンシフトを実施するには、ターゲットグループのクロスゾーン負荷分散をオフにする必要があります。
クロスゾーン負荷分散をオフにすることで、各 AZ のロードバランサーノードは、ローカル AZ 内のターゲットのみにリクエストをルーティングするようになります。
以下の図(公式ブログから引用)の左がオン、右がオフの状態です。
そのため、公式ドキュメント-クロスゾーン負荷分散をオフにするの手順を参考に、オフに設定します。
ゾーンシフトの開始
それでは、ゾーンシフトを試していきます。
ゾーンシフトは、ロードバランサーの統合タブから開始できます。
今回は、ゾーンシフトで ap-northeast-1c を10分間切り離してみます。
ゾーンシフトを開始すると、以下のような画面表示になります。
ゾーンシフト開始直後、約1分程度で、ap-northeast-1c の ALB ノードの IP が名前解決されなくなり、1c へのトラフィックが遮断されていることがわかります。 もちろん、curlしても ap-northeast-1a のインスタンスからの結果しか返りません。
$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short 54.248.1.219 $ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com Hello From 1a
10分後、ゾーンシフトが終了すると、約1分程度で以下のように ap-northeast-1c の ALB ノードの IP が復活し、再び 2AZ 構成の ALB に戻りました。
$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short 52.197.178.163 54.248.1.219 $ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com Hello From 1a $ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com Hello From 1c
上記結果から分かるように、ゾーンシフトでは、切り離したい AZ にある ロードバランサーノード の IP を DNS から解除することで、パージ操作を行なっているようです。
手順としては、クロスゾーン負荷分散をオフにして、開始ボタンを押すだけなので、かなり便利な機能になっていますね。これなら、障害時でも慌てずに操作ができそうです。
まとめ
今回は、ゾーンシフトの開始手順をご紹介しました。本機能を用いることで、2AZ 構成の ALB でもリソースの切り離しが容易にできることがわかりました。
なお、ゾーンシフトでは、実行中に期間の更新やキャンセルが可能になっています。そのため、障害発生時だけでなく、開発中の一時的なテストの際にも使えそうです。AWS は便利な機能が続々と出てくるので、すごいですね。
この記事がどなたかの役に立てば幸いです。
最後までお読みいただきありがとうございました!
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。